sgdk
|
00001 00011 #ifndef _MATHS_H_ 00012 #define _MATHS_H_ 00013 00014 00015 extern const fix32 sintab32[1024]; 00016 extern const fix16 sintab16[1024]; 00017 00018 #if (MATH_BIG_TABLES != 0) 00019 extern const fix16 log2tab16[0x10000]; 00020 extern const fix16 log10tab16[0x10000]; 00021 extern const fix16 sqrttab16[0x10000]; 00022 #endif 00023 00024 00029 #define min(X, Y) ((X) < (Y))?(X):(Y) 00030 00035 #define max(X, Y) ((X) > (Y))?(X):(Y) 00036 00037 00038 #ifndef PI 00039 00043 #define PI 3.14159265358979323846 00044 #endif 00045 00046 00047 #define FIX32_INT_BITS 22 00048 #define FIX32_FRAC_BITS (32 - FIX32_INT_BITS) 00049 00050 #define FIX32_INT_MASK (((1 << FIX32_INT_BITS) - 1) << FIX32_FRAC_BITS) 00051 #define FIX32_FRAC_MASK ((1 << FIX32_FRAC_BITS) - 1) 00052 00059 #define FIX32(value) ((fix32) ((value) * (1 << FIX32_FRAC_BITS))) 00060 00065 #define intToFix32(value) ((value) << FIX32_FRAC_BITS) 00066 00070 #define fix32ToInt(value) ((value) >> FIX32_FRAC_BITS) 00071 00076 #define fix32Round(value) \ 00077 (fix32Frac(value) > FIX32(0.5))?fix32Int(value + FIX32(1)) + 1:fix32Int(value) 00078 00083 #define fix32ToRoundedInt(value) \ 00084 (fix32Frac(value) > FIX32(0.5))?fix32ToInt(value) + 1:fix32ToInt(value) 00085 00090 #define fix32Frac(value) ((value) & FIX32_FRAC_MASK) 00091 00095 #define fix32Int(value) ((value) & FIX32_INT_MASK) 00096 00101 #define fix32Add(val1, val2) ((val1) + (val2)) 00102 00106 #define fix32Sub(val1, val2) ((val1) - (val2)) 00107 00111 #define fix32Neg(value) (0 - (value)) 00112 00117 #define fix32Mul(val1, val2) (((val1) * (val2)) >> FIX32_FRAC_BITS) 00118 00122 #define fix32Div(val1, val2) (((val1) << FIX32_FRAC_BITS) / (val2)) 00123 00124 00125 #define FIX16_INT_BITS 10 00126 #define FIX16_FRAC_BITS (16 - FIX16_INT_BITS) 00127 00128 #define FIX16_INT_MASK (((1 << FIX16_INT_BITS) - 1) << FIX16_FRAC_BITS) 00129 #define FIX16_FRAC_MASK ((1 << FIX16_FRAC_BITS) - 1) 00130 00137 #define FIX16(value) ((fix16) ((value) * (1 << FIX16_FRAC_BITS))) 00138 00143 #define intToFix16(value) ((value) << FIX16_FRAC_BITS) 00144 00148 #define fix16ToInt(value) ((value) >> FIX16_FRAC_BITS) 00149 00154 #define fix16Round(value) \ 00155 (fix16Frac(value) > FIX16(0.5))?fix16Int(value + FIX16(1)) + 1:fix16Int(value) 00156 00161 #define fix16ToRoundedInt(value) \ 00162 (fix16Frac(value) > FIX16(0.5))?fix16ToInt(value) + 1:fix16ToInt(value) 00163 00168 #define fix16Frac(value) ((value) & FIX16_FRAC_MASK) 00169 00173 #define fix16Int(value) ((value) & FIX16_INT_MASK) 00174 00179 #define fix16Add(val1, val2) ((val1) + (val2)) 00180 00184 #define fix16Sub(val1, val2) ((val1) - (val2)) 00185 00189 #define fix16Neg(value) (0 - (value)) 00190 00195 #define fix16Mul(val1, val2) (((val1) * (val2)) >> FIX16_FRAC_BITS) 00196 00200 #define fix16Div(val1, val2) (((val1) << FIX16_FRAC_BITS) / (val2)) 00201 00202 00203 #if (MATH_BIG_TABLES != 0) 00204 00209 #define fix16Log2(v) log2tab16[v] 00210 00214 #define fix16Log10(v) log10tab16[v] 00215 00219 #define fix16Sqrt(v) sqrttab16[v] 00220 00221 #endif 00222 00223 00228 #define fix32ToFix16(value) (((value) << FIX16_FRAC_BITS) >> FIX32_FRAC_BITS) 00229 00233 #define fix16ToFix32(value) (((value) << FIX32_FRAC_BITS) >> FIX16_FRAC_BITS) 00234 00240 #define sinFix32(value) sintab32[(value) & 1023] 00241 00246 #define cosFix32(value) sintab32[((value) + 256) & 1023] 00247 00253 #define sinFix16(value) sintab16[(value) & 1023] 00254 00259 #define cosFix16(value) sintab16[((value) + 256) & 1023] 00260 00261 00262 // 2D STUFF 00263 00268 typedef struct 00269 { 00270 u16 x; 00271 u16 y; 00272 } Vect2D_u16; 00273 00278 typedef struct 00279 { 00280 s16 x; 00281 s16 y; 00282 } Vect2D_s16; 00283 00288 typedef struct 00289 { 00290 u32 x; 00291 u32 y; 00292 } Vect2D_u32; 00293 00298 typedef struct 00299 { 00300 s32 x; 00301 s32 y; 00302 } Vect2D_s32; 00303 00308 typedef struct 00309 { 00310 fix16 x; 00311 fix16 y; 00312 } Vect2D_f16; 00313 00319 typedef struct 00320 { 00321 Vect2D_f16 a; 00322 Vect2D_f16 b; 00323 } Mat2D_f16; 00324 00325 00326 // 3D STUFF 00327 00332 typedef struct 00333 { 00334 fix16 x; 00335 fix16 y; 00336 fix16 z; 00337 } Vect3D_f16; 00338 00344 typedef struct 00345 { 00346 Vect3D_f16 a; 00347 Vect3D_f16 b; 00348 Vect3D_f16 c; 00349 } Mat3D_f16; 00350 00351 00352 // 4D STUFF 00353 00358 typedef struct 00359 { 00360 fix16 x; 00361 fix16 y; 00362 fix16 z; 00363 fix16 w; 00364 } Vect4D_f16; 00365 00371 typedef struct 00372 { 00373 Vect4D_f16 a; 00374 Vect4D_f16 b; 00375 Vect4D_f16 c; 00376 Vect4D_f16 d; 00377 } Mat4D_f16; 00378 00379 00380 00385 u16 random(); 00386 00394 u32 intToBCD(u32 value); 00395 00406 u32 distance_approx(s32 dx, s32 dy); 00407 00408 00420 void QSort_u8(u8 *data, u16 left, u16 right); 00432 void QSort_s8(s8 *data, u16 left, u16 right); 00444 void QSort_u16(u16 *data, u16 left, u16 right); 00456 void QSort_s16(s16 *data, u16 left, u16 right); 00468 void QSort_u32(u32 *data, u16 left, u16 right); 00480 void QSort_s32(s32 *data, u16 left, u16 right); 00481 00482 00483 #endif // _MATHS_H_